package mvc.handler;

import mvc.exception.AgeException;
import mvc.exception.NameException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

/**
 * ControllerAdvice:控制器增强->增加异常处理功能
 * 使用原则：需要在配置文件中指定组件扫描器
 * @Author:ChenZhangKun
 * @Date: 2020/11/18 19:39
 */
@ControllerAdvice
public class GlobalExceptionHandler {
    /**
     *  ExceptionHandler 表示异常类型，由该方法处理
     * @param exception 表示controller中抛出的异常对象，可以通过其获取异常信息
     * @return
     */
    @ExceptionHandler(value = NameException.class)
    public ModelAndView name(Exception exception){
        // 处理nameException异常
        /**
         * 处理逻辑
         * 1 吧异常记录下俩，记录到数据库或日志文件
         *   记录日志发生的时间，哪个方法发生，异常错误内容
         * 2 发送通知，吧异常信息通过邮件，短信给发送给相关人员
         * 3 给用户友好提示
         */
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("msg","姓名必须是陈彰坤，其他不能访问");
        modelAndView.addObject("ex",exception.getMessage());
        modelAndView.setViewName("/nameError");
        return modelAndView;
    }
    @ExceptionHandler(value = AgeException.class)
    public ModelAndView age(Exception exception){
        // 处理nameException异常
        /**
         * 处理逻辑
         * 1 吧异常记录下俩，记录到数据库或日志文件
         *   记录日志发生的时间，哪个方法发生，异常错误内容
         * 2 发送通知，吧异常信息通过邮件，短信给发送给相关人员
         * 3 给用户友好提示
         */
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("msg","年龄必须是十五");
        modelAndView.addObject("ex",exception.getMessage());
        modelAndView.setViewName("/ageError");
        return modelAndView;
    }

    /**
     * 处理未知异常
     * @return
     */
    @ExceptionHandler
    public ModelAndView other(Exception exception){
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("msg","未知异常");
        modelAndView.addObject("ex",exception.getMessage());
        modelAndView.setViewName("/defaultError");
        return modelAndView;
    }
}
